/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.dao;

import br.com.deployment.daogenerico.DaoGenerico;
import br.com.deployment.entidade.selo.DetalheEntradaSelo;
import br.com.deployment.entidade.selo.EntradaSelo;
import br.com.deployment.entidade.selo.Selo;
import br.com.deployment.interfaces.DetalheEntradaSeloDaoIn;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.Query;
import javax.persistence.TemporalType;

/**
 *
 * @author luciano
 */
@Stateless
@LocalBean
public class DetalheEntradaSeloDao extends DaoGenerico<DetalheEntradaSelo> implements DetalheEntradaSeloDaoIn{

    public DetalheEntradaSeloDao() {
        super(DetalheEntradaSelo.class);
    }
    
    public DetalheEntradaSelo findNome(String nome) {
        DetalheEntradaSelo lista = new DetalheEntradaSelo();
        String sql = "select d from DetalheEntradaSelo d where d.nome like :nome";        
        Query query = getEm().createQuery(sql);
        
        query.setParameter("nome", nome);
        
        lista = (DetalheEntradaSelo) query.getSingleResult();
        return lista;
    }

    public List<DetalheEntradaSelo> findDetalheEntradaSelos(DetalheEntradaSelo des){
        return null;
    }
    
    @Override
    public List<DetalheEntradaSelo> getEntradaSelo(EntradaSelo entradaSelo){
        String sql = "select e from EntradaSelo es JOIN es.listDetalhe e where"
                + " es.id = :id";        
        Query query = getEm().createQuery(sql);
        query.setParameter("id", entradaSelo.getId());
        
        return (List<DetalheEntradaSelo>) query.getResultList();
    }
    
    public DetalheEntradaSelo findDetalheEntradaSelo(DetalheEntradaSelo des, EntradaSelo es, String nomeUsr){
        DetalheEntradaSelo lista = new DetalheEntradaSelo();
        System.err.println(des.getTipoSelo());
        System.err.println(nomeUsr);
        System.err.println(es);
        String sql = "select d from DetalheEntradaSelo d JOIN d.tipoSelo ts JOIN d.entradaSelo esf JOIN esf.usuario u"
                + " where d.numFim = :numFim"
                + " and d.numIni = :numIni"
                + " and d.preco = :preco"
                + " and d.serie = :serie"
                + " and d.qtd = :qtd"
                + " and ts.id = :tipo"
                + " and esf.dataEntrada = :data"
                + " and u.login = :nome"
                + " and esf.numeroNota = :numNota"
                + " and esf.dataNote = :dataNota";       
        Query query = getEm().createQuery(sql);
        
        query.setParameter("numFim", des.getNumFim());
        query.setParameter("numIni", des.getNumIni());
        query.setParameter("preco", des.getPreco());
        query.setParameter("qtd", des.getQtd());
        query.setParameter("serie", des.getSerie());
        query.setParameter("tipo", des.getTipoSelo().getId());
        query.setParameter("nome", nomeUsr);
        query.setParameter("data", es.getDataEntrada());
        query.setParameter("numNota", es.getNumeroNota());
        query.setParameter("dataNota", es.getDataNote());
        System.err.println(query.getResultList());
        lista = (DetalheEntradaSelo) query.getSingleResult();
        
        return lista;
    }

    public Long entradaSeloPorMes(Date dataIni, Date dataFinal){
        Long qtd;
        List<DetalheEntradaSelo> lst = new ArrayList<DetalheEntradaSelo>();
        String sql = "Select count(des) from DetalheEntradaSelo des JOIN des.entradaSelo es"
                + " where es.dataEntrada BETWEEN :dataIni and :dataFinal";
        
        Query query = getEm().createQuery(sql);
        query.setParameter("dataIni", dataIni, TemporalType.DATE);
        query.setParameter("dataFinal", dataFinal, TemporalType.DATE);
        
        qtd = (Long) query.getSingleResult();
        System.err.println("Resul"+qtd);
        return qtd;
    }
    
    public List<Selo> buscarSelos(DetalheEntradaSelo detalheEntradaSelo){
        String sql = "select * from Selos s where s.detalheEntradaSelo=:entradaSelo AND s.serie=serie AND s.tipoSelo=:tipoSelo";
        Query query = getEm().createQuery(sql);
        query.setParameter("entradaSelo",detalheEntradaSelo.getId());
        query.setParameter("serie",detalheEntradaSelo.getSerie());
        query.setParameter("tipoSelo",detalheEntradaSelo.getTipoSelo());
        
        List<Selo> selos = query.getResultList();
        return selos;
    }
       
          
    public boolean podeModificar(DetalheEntradaSelo detalheEntradaSelo){
        String sql = "select count(s) from Selo s where s.protocolado=TRUE AND s.detalheEntradaSelo.id=:id";
        Query q = getEm().createQuery(sql);
        q.setParameter("id", detalheEntradaSelo.getId());
//        List<Selo> selos = q.getResultList();
        Long l = (Long) q.getSingleResult();
        return l.intValue() == 0;
    }
    
    
}
